การเรียกใช้ AWS Lambda หลังจาก AWS Glue Crawler รวบรวมข้อมูล
บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า AWS Glue crawler のクロールが終わったら Lambda を実行する โดยเจ้าของบทความนี้คือ คุณ Yuta Shimizu
จุดประสงค์
ในบทความนี้ เราจะมาสร้างการกำหนดค่าเพื่อเรียกใช้ Lambda หลังจากที่ AWS Glue Crawler รวบรวมข้อมูลเสร็จแล้ว
โดยระบบการทำงานจะเป็นเหมือนรูปภาพนี้
บทความนี้อ้างอิงจากบล็อกของทาง AWS Event-driven refresh of SPICE datasets in Amazon QuickSight [1] โดยส่วนใหญ่จะใช้คำสั่ง CDK
ข้อกำหนดเบื้องต้น/สิ่งที่ต้องรู้
- บัญชี AWS
- IAM Role และ Policy ที่มีสิทธิ์ในการสร้าง EC2 instance
- AWS region ที่สามารถใช้คำสั่ง cdk bootstrap
- วิธีการสร้าง IAM Role และ Policy และการใช้ role กับ EC2 instance, วิธีการใช้ Session Manager และ AWS CLI
Step 1: สร้าง IAM role เพื่อนำไปใช้กับ EC2 instance
สร้าง role โดยใช้ policy ตามด้านล่างนี้
จากนั้นจึงนำ role ไปใช้กับ EC2 instance ภายหลัง
Note: ในการใช้งานจริงควรตั้งค่าให้สิทธิ์ตามหลัก least privilege
- AmazonSSMManagedInstanceCore: ใช้เพื่อให้ Session Manager เชื่อมต่อกับ EC2 instance
- AmazonS3FullAccess: สำหรับการอัปโหลดและลบไฟล์ใน Amazon S3
- Inline Policy ตามด้านล่างนี้: เพื่อให้มีสิทธิ์ในการ deploy CDK (อ้างอิงจากบทความ[2]) และเริ่มใช้งาน AWS Glue Crawler, CloudWatch Logs และ CloudFormation Stacks สำหรับการค้นหาและตรวจสอบ event ที่เกิดขึ้น
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:aws:iam::*:role/cdk-*" ] }, { "Sid": "StartCrawler", "Effect": "Allow", "Action": [ "glue:StartCrawler" ], "Resource": [ "*" ] }, { "Sid": "TailLog", "Effect": "Allow", "Action": [ "logs:StartLiveTail", "logs:FilterLogEvents" ], "Resource": [ "*" ] }, { "Sid": "CfnDescribe", "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks" ], "Resource": [ "*" ] } ] }
จากนั้นให้นำ role ไปใช้กับ EC2 instance
ซึ่งในบทความนี้จะตั้งค่า EC2 instance ตามด้านล่างนี้ - OS: Amazon Linux 2023
- Instance type: t2.micro
- Subnet: Public subnet
- Public IP assignment: Enabled
- Security group: ปิดทุก port เนื่องจากเราตั้งค่าให้ใช้แค่เพียง Session Manager ในการเชื่อมต่อ
Step 2: ติดตั้งแพ็คเกจที่จำเป็นบน EC2 instance สำหรับการใช้งาน CDK
เชื่อมต่อ EC2 instance ผ่านทาง Session Manager จากนั้นใช้คำสั่งตามนี้
สามารถเข้าได้โดยไปที่หน้า Management console เข้าไปที่ EC2 > เลือก instance ที่ต้องการเชื่อมต่อ > คลิก Connect
> คลิก Session Manager
cd ~ sudo dnf install -y git curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # อ้างอิงจากบทความ [3] source ~/.bashrc nvm install --lts npm -g install typescript aws-cdk
หลักจากที่ใช้คำสั่งตามด้านบน git จะถูกติดตั้ง(ใช้สำหรับการโคลนโปรเจกต์ในภายหลัง)
ตามด้วยติดตั้ง node.js, typescript, และ aws-cdk เพื่อรันคำสั่ง CDK
หากไม่พบข้อผิดพลาดใดๆในขั้นตอนนี้ เพียงเท่านี้ก็พร้อมใช้งานแล้วครับ
Step 3: สร้าง S3 bucket, Glue Crawler, EventBridge Rule, CloudWatch logs และ Lambda function
เชื่อมต่อ EC2 instance ผ่านทาง Session Manager จากนั้นใช้คำสั่งตามด้านล่างเพื่อโคลนโปรเจกต์ตาม ลิงก์ และติดตั้งแพ็คเกจที่จำเป็น
cd ~ git clone https://github.com/yuta-cmth/blog-glue-trigger.git cd blog-glue-trigger npm i
จากนั้นสร้าง resource ต่างๆด้วยคำสั่ง CDK
cdk deploy --require-approval never
หลังจากรันคำสั่งตามด้านบน เมื่อสำเร็จแล้วจะแสดงผลลัพธ์ตามด้านล่าง
✨ Total time: 110.1s
โดย resource ต่างๆที่สร้างขึ้นจากคำสั่ง CDK จะมีดังนี้ตามภาพด้านล่าง
หากต้องการตรวจสอบ resource ต่างๆก็สามารถตรวจสอบได้ที่ Management console หรือ CloudFormation Stack
ขั้นตอนการทำงาน
- เรียกใช้งาน Crawler
- หลังจากที่ Crawler รวบรวมข้อมูลเสร็จแล้ว EventBridge Rule จะทำการจับ event และเรียกใช้งาน Lambda
- Lambda จะเขียน log ไปที่ CloudWatch Logs(สามารถดูโค้ดของ AWS Lambda ได้ที่ ลิงก์)
- ทำการยืนยันว่า logs ถูกเขียนไปที่ CloudWatch Logs
ต่อไปนี้เราจะทำการตรวจสอบกระบวนการว่าเป็นไปตามแผนภาพหรือเปล่า
Step 4: ยืนยันว่า Lambda ทำงานหลังจากการรวบรวมข้อมูล
เริ่มด้วยการใช้คำสั่งตามด้านล่าง เพื่อเก็บรายชื่อ resource จาก CloudFormation ไว้ในตัวแปร
# ให้ S3 bucket รวบรวมข้อมูล crawler และ lambda log ที่ทำงานหลังจากการรวบรวมข้อมูลเสร็จแล้ว # ได้รับจากผลลัพธ์ CloudFormation bucket_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerBucketName`].OutputValue') crawler_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerName`].OutputValue') log_group_name=$(aws cloudformation describe-stacks --stack-name BlogGlueTriggerStack --output text --query 'Stacks[0].Outputs[?OutputKey==`BlogGlueCrawlerEventHandlerLogGroupName`].OutputValue')
จากนั้นใช้คำสั่งตามด้านล่างนี้ เพื่ออัปโหลดไฟล์ไปที่ S3 และเรียกใช้ Glue Crawler
นอกจากนี้ยังให้รันคำสั่ง aws logs และติดตาม Lambda logs ที่จะทำงานหลังจากการรวบรวมข้อมูลสำเร็จ
aws s3 cp ./s3_test_data/data "s3://${bucket_name}/data" --recursive aws glue start-crawler --name "${crawler_name}" aws logs tail --follow "${log_group_name}"
การรวบรวมข้อมูลอาจจะใช้เวลาประมาณ 1 นาที
หากมีข้อความจาก Lambda แสดงตามภาพด้านล่าง แสดงว่า Lambda กำลังทำงานอยู่หลังจากการรวบรวมข้อมูลเสร็จสมบูรณ์
Step 5: เคลียร์ resource
ลบ resource ที่สร้างด้วย CDK โดยใช้คำสั่งดังต่อไปนี้
aws s3 rm "s3://${bucket_name}" --recursive cdk destroy --force
เราใช้ s3 rm
เพราะว่าคำสั่ง cdk destroy
ไม่สามารถลบ S3 bucket ที่มีข้อมูลอยู่ได้
สรุป
ในบทความนี้เราได้อธิบายวิธีสร้างการกำหนดค่าเพื่อที่จะใช้งาน Lambda หลังจากที่ AWS Glue Crawler รวบรวมข้อมูลเสร็จเรียบร้อย หวังว่าบทความนี้จะมีประโยชน์กับการนำไปใช้การประมวลผลข้อมูลอัตโนมัติ
บทความต้นฉบับ
AWS Glue crawler のクロールが終わったら Lambda を実行する(ภาษาญี่ปุ่น)
บทความที่เกี่ยวข้อง
- บทความที่ [1] Event-driven refresh of SPICE datasets in Amazon QuickSight(ภาษาอังกฤษ)
- บทความที่ [2] Kay, A. (n.d.). What IAM permissions are needed to use CDK Deploy? Stack Overflow(ภาษาอังกฤษ)
- บทความที่ [3] Tutorial: Setting Up Node.js on an Amazon EC2 Instance. (n.d.). AWS SDK for JavaScript(ภาษาอังกฤษ)